package com.wang.gulimall.product.exception;

import com.wang.common.exception.BizCodeEnum;
import com.wang.common.utils.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.util.HashMap;
import java.util.Map;


/**
 * Desc:统一异常处理，以后业务中异常可以统一抛出，较少业务代码的耦合
 *
 * @author wangliuyang
 * @date
 */
@Slf4j
@RestControllerAdvice(basePackages = "com.wang.gulimall.product.app")//捕捉异常
public class GulimallProductExceptionHandler {

    @ExceptionHandler(value = MethodArgumentNotValidException.class)//处理异常
    public R handleValidationException(MethodArgumentNotValidException exception) {
        HashMap<String, String> hashMap = new HashMap<>();
        //获取异常数据
        BindingResult bindingResult = exception.getBindingResult();
        bindingResult.getFieldErrors().forEach(fieldError -> {
            String defaultMessage = fieldError.getDefaultMessage();//异常信息
            String field = fieldError.getField();
            hashMap.put(field, defaultMessage);
        });
        log.error("数据校验出现问题{},异常类型{}，异常属性{}", exception.getMessage(), exception.getClass());
        return R.error(BizCodeEnum.VAILD_EXCEPTION.getCode(), BizCodeEnum.VAILD_EXCEPTION.getMsg()).put("data", hashMap);
    }

    @ExceptionHandler(value = Throwable.class)
    public R handleException(Throwable throwable) {
        log.error("未知异常{},异常类型{}", throwable.getMessage(), throwable.getClass());
        return R.error(BizCodeEnum.UNKNOW_EXCEPTION.getCode(), BizCodeEnum.UNKNOW_EXCEPTION.getMsg());
    }


//
//    /**
//     * Desc:处理后端校验数据异常
//     *
//     * @param exception
//     * @return {@link R}
//     * @author wangliuyang
//     * @date
//     */
//    @ExceptionHandler(value = MethodArgumentNotValidException.class)
//    public R handleValidationException(MethodArgumentNotValidException exception) {
//        Map<String, String> map = new HashMap<>();
//        // 获取数据校验的错误结果
//        BindingResult bindingResult = exception.getBindingResult();
//        bindingResult.getFieldErrors().forEach(fieldError -> {
//            String message = fieldError.getDefaultMessage();
//            String field = fieldError.getField();
//            map.put(field, message);
//        });
//
//        log.error("数据校验出现问题{},异常类型{}", exception.getMessage(), exception.getClass());
//
//        return R.error(BizCodeEnum.VAILD_EXCEPTION.getCode(), BizCodeEnum.VAILD_EXCEPTION.getMsg()).put("data", map);
//    }

/*    @ExceptionHandler(value = Throwable.class)
    public R handleException(Throwable throwable) {
        log.error("未知异常{},异常类型{}", throwable.getMessage(), throwable.getClass());
        return R.error(BizCodeEnum.UNKNOW_EXCEPTION.getCode(), BizCodeEnum.UNKNOW_EXCEPTION.getMsg());
    }*/

}
